# Copyright 2021 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
load("@bazel_skylib//rules:common_settings.bzl", "bool_setting")
load("//python:py_binary.bzl", "py_binary")
load("//python:py_library.bzl", "py_library")
load("//python:versions.bzl", "print_toolchains_checksums")
load(":py_exec_tools_toolchain.bzl", "current_interpreter_executable")
load(":sentinel.bzl", "sentinel")
load(":stamp.bzl", "stamp_build_setting")

package(
    default_visibility = ["//:__subpackages__"],
)

licenses(["notice"])

filegroup(
    name = "distribution",
    srcs = glob(["**"]) + [
        "//python/private/proto:distribution",
        "//python/private/pypi:distribution",
        "//python/private/whl_filegroup:distribution",
        "//tools/build_defs/python/private:distribution",
    ],
    visibility = ["//python:__pkg__"],
)

filegroup(
    name = "coverage_deps",
    srcs = ["coverage_deps.bzl"],
    visibility = ["//tools/private/update_deps:__pkg__"],
)

# Filegroup of bzl files that can be used by downstream rules for documentation generation
filegroup(
    name = "bzl",
    srcs = glob(["**/*.bzl"]),
    visibility = ["//python:__pkg__"],
)

bzl_library(
    name = "attributes_bzl",
    srcs = ["attributes.bzl"],
    deps = [
        ":common_bzl",
        ":enum_bzl",
        ":flags_bzl",
        ":py_info_bzl",
        ":py_internal_bzl",
        ":reexports_bzl",
        ":rules_cc_srcs_bzl",
        ":semantics_bzl",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "auth_bzl",
    srcs = ["auth.bzl"],
    deps = [":bazel_tools_bzl"],
)

bzl_library(
    name = "runtime_env_toolchain_bzl",
    srcs = ["runtime_env_toolchain.bzl"],
    deps = [
        ":py_exec_tools_toolchain_bzl",
        ":toolchain_types_bzl",
        "//python:py_runtime_bzl",
        "//python:py_runtime_pair_bzl",
    ],
)

bzl_library(
    name = "builders_bzl",
    srcs = ["builders.bzl"],
    deps = [
        "@bazel_skylib//lib:types",
    ],
)

bzl_library(
    name = "bzlmod_enabled_bzl",
    srcs = ["bzlmod_enabled.bzl"],
)

bzl_library(
    name = "cc_helper_bzl",
    srcs = ["cc_helper.bzl"],
    deps = [":py_internal_bzl"],
)

bzl_library(
    name = "common_bazel_bzl",
    srcs = ["common_bazel.bzl"],
    deps = [
        ":attributes_bzl",
        ":common_bzl",
        ":py_cc_link_params_info_bzl",
        ":py_internal_bzl",
        ":py_interpreter_program_bzl",
        ":toolchain_types_bzl",
        "@bazel_skylib//lib:paths",
    ],
)

bzl_library(
    name = "common_bzl",
    srcs = ["common.bzl"],
    deps = [
        ":cc_helper_bzl",
        ":py_info_bzl",
        ":py_internal_bzl",
        ":reexports_bzl",
        ":rules_cc_srcs_bzl",
        ":semantics_bzl",
    ],
)

bzl_library(
    name = "config_settings_bzl",
    srcs = ["config_settings.bzl"],
    deps = [
        ":semver_bzl",
        "@bazel_skylib//lib:selects",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "coverage_deps_bzl",
    srcs = ["coverage_deps.bzl"],
    deps = [
        ":bazel_tools_bzl",
        ":version_label_bzl",
    ],
)

bzl_library(
    name = "enum_bzl",
    srcs = ["enum.bzl"],
)

bzl_library(
    name = "envsubst_bzl",
    srcs = ["envsubst.bzl"],
)

bzl_library(
    name = "flags_bzl",
    srcs = ["flags.bzl"],
    deps = [
        ":enum_bzl",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "full_version_bzl",
    srcs = ["full_version.bzl"],
)

bzl_library(
    name = "glob_excludes_bzl",
    srcs = ["glob_excludes.bzl"],
    deps = [":util_bzl"],
)

bzl_library(
    name = "internal_config_repo_bzl",
    srcs = ["internal_config_repo.bzl"],
    deps = [":bzlmod_enabled_bzl"],
)

bzl_library(
    name = "is_standalone_interpreter_bzl",
    srcs = ["is_standalone_interpreter.bzl"],
    deps = [
        ":repo_utils_bzl",
    ],
)

bzl_library(
    name = "normalize_name_bzl",
    srcs = ["normalize_name.bzl"],
)

bzl_library(
    name = "python_bzl",
    srcs = ["python.bzl"],
    deps = [
        ":full_version_bzl",
        ":python_register_toolchains_bzl",
        ":pythons_hub_bzl",
        ":repo_utils_bzl",
        ":semver_bzl",
        ":toolchains_repo_bzl",
        ":util_bzl",
        "@bazel_features//:features",
    ],
)

bzl_library(
    name = "python_register_toolchains_bzl",
    srcs = ["python_register_toolchains.bzl"],
    deps = [
        ":auth_bzl",
        ":bazel_tools_bzl",
        ":coverage_deps_bzl",
        ":full_version_bzl",
        ":internal_config_repo_bzl",
        ":python_repository_bzl",
        ":toolchains_repo_bzl",
        "//python:versions_bzl",
        "//python/private/pypi:deps_bzl",
    ],
)

bzl_library(
    name = "python_repository_bzl",
    srcs = ["python_repository.bzl"],
    deps = [
        ":auth_bzl",
        ":repo_utils_bzl",
        ":text_util_bzl",
        "//python:versions_bzl",
    ],
)

bzl_library(
    name = "python_register_multi_toolchains_bzl",
    srcs = ["python_register_multi_toolchains.bzl"],
    deps = [
        ":python_register_toolchains_bzl",
        ":toolchains_repo_bzl",
        "//python:versions_bzl",
    ],
)

bzl_library(
    name = "pythons_hub_bzl",
    srcs = ["pythons_hub.bzl"],
    deps = [
        ":py_toolchain_suite_bzl",
        ":text_util_bzl",
    ],
)

bzl_library(
    name = "py_binary_macro_bzl",
    srcs = ["py_binary_macro.bzl"],
    deps = [
        ":common_bzl",
        ":py_binary_rule_bzl",
    ],
)

bzl_library(
    name = "py_binary_rule_bzl",
    srcs = ["py_binary_rule.bzl"],
    deps = [
        ":attributes_bzl",
        ":py_executable_bazel_bzl",
        ":semantics_bzl",
        "@bazel_skylib//lib:dicts",
    ],
)

bzl_library(
    name = "py_cc_link_params_info_bzl",
    srcs = ["py_cc_link_params_info.bzl"],
    deps = [
        ":rules_cc_srcs_bzl",
        ":util_bzl",
    ],
)

bzl_library(
    name = "py_cc_toolchain_macro_bzl",
    srcs = ["py_cc_toolchain_macro.bzl"],
    deps = [
        ":py_cc_toolchain_rule_bzl",
    ],
)

bzl_library(
    name = "py_cc_toolchain_rule_bzl",
    srcs = ["py_cc_toolchain_rule.bzl"],
    deps = [
        ":py_cc_toolchain_info_bzl",
        ":rules_cc_srcs_bzl",
        ":util_bzl",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "py_cc_toolchain_info_bzl",
    srcs = ["py_cc_toolchain_info.bzl"],
)

bzl_library(
    name = "py_console_script_binary_bzl",
    srcs = [
        "py_console_script_binary.bzl",
        "py_console_script_gen.bzl",
    ],
    visibility = ["//python/entry_points:__pkg__"],
    deps = [
        "//python:py_binary_bzl",
    ],
)

bzl_library(
    name = "py_exec_tools_info_bzl",
    srcs = ["py_exec_tools_info.bzl"],
)

bzl_library(
    name = "py_exec_tools_toolchain_bzl",
    srcs = ["py_exec_tools_toolchain.bzl"],
    deps = [
        ":py_exec_tools_info_bzl",
        ":sentinel_bzl",
        ":toolchain_types_bzl",
        "@bazel_skylib//lib:paths",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "py_executable_bazel_bzl",
    srcs = ["py_executable_bazel.bzl"],
    deps = [
        ":attributes_bzl",
        ":common_bazel_bzl",
        ":common_bzl",
        ":py_executable_bzl",
        ":py_internal_bzl",
        ":py_runtime_info_bzl",
        ":semantics_bzl",
    ],
)

bzl_library(
    name = "py_executable_bzl",
    srcs = ["py_executable.bzl"],
    deps = [
        ":attributes_bzl",
        ":cc_helper_bzl",
        ":common_bzl",
        ":flags_bzl",
        ":py_cc_link_params_info_bzl",
        ":py_executable_info_bzl",
        ":py_info_bzl",
        ":py_internal_bzl",
        ":py_runtime_info_bzl",
        ":rules_cc_srcs_bzl",
        ":toolchain_types_bzl",
        "@bazel_skylib//lib:dicts",
        "@bazel_skylib//lib:structs",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "py_executable_info_bzl",
    srcs = ["py_executable_info.bzl"],
)

bzl_library(
    name = "py_info_bzl",
    srcs = ["py_info.bzl"],
    deps = [
        ":builders_bzl",
        ":reexports_bzl",
        ":util_bzl",
        "@rules_python_internal//:rules_python_config_bzl",
    ],
)

bzl_library(
    name = "py_internal_bzl",
    srcs = ["py_internal.bzl"],
    deps = ["@rules_python_internal//:py_internal_bzl"],
)

bzl_library(
    name = "py_interpreter_program_bzl",
    srcs = ["py_interpreter_program.bzl"],
    deps = ["@bazel_skylib//rules:common_settings"],
)

bzl_library(
    name = "py_library_bzl",
    srcs = ["py_library.bzl"],
    deps = [
        ":attributes_bzl",
        ":common_bzl",
        ":flags_bzl",
        ":py_cc_link_params_info_bzl",
        ":py_internal_bzl",
        ":toolchain_types_bzl",
        "@bazel_skylib//lib:dicts",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "py_library_macro_bzl",
    srcs = ["py_library_macro.bzl"],
    deps = [":py_library_rule_bzl"],
)

bzl_library(
    name = "py_library_rule_bzl",
    srcs = ["py_library_rule.bzl"],
    deps = [
        ":common_bazel_bzl",
        ":common_bzl",
        ":py_library_bzl",
    ],
)

bzl_library(
    name = "py_package_bzl",
    srcs = ["py_package.bzl"],
    visibility = ["//:__subpackages__"],
    deps = [
        ":builders_bzl",
        ":py_info_bzl",
    ],
)

bzl_library(
    name = "py_runtime_info_bzl",
    srcs = ["py_runtime_info.bzl"],
    deps = [":util_bzl"],
)

bzl_library(
    name = "py_repositories_bzl",
    srcs = ["py_repositories.bzl"],
    deps = [
        ":bazel_tools_bzl",
        ":internal_config_repo_bzl",
        ":pythons_hub_bzl",
        "//python:versions_bzl",
        "//python/private/pypi:deps_bzl",
    ],
)

bzl_library(
    name = "py_runtime_macro_bzl",
    srcs = ["py_runtime_macro.bzl"],
    deps = [":py_runtime_rule_bzl"],
)

bzl_library(
    name = "py_runtime_rule_bzl",
    srcs = ["py_runtime_rule.bzl"],
    deps = [
        ":attributes_bzl",
        ":py_internal_bzl",
        ":py_runtime_info_bzl",
        ":reexports_bzl",
        ":util_bzl",
        "@bazel_skylib//lib:dicts",
        "@bazel_skylib//lib:paths",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "py_runtime_pair_macro_bzl",
    srcs = ["py_runtime_pair_macro.bzl"],
    visibility = ["//:__subpackages__"],
    deps = [":py_runtime_pair_rule_bzl"],
)

bzl_library(
    name = "py_runtime_pair_rule_bzl",
    srcs = ["py_runtime_pair_rule.bzl"],
    deps = [
        "//python:py_runtime_bzl",
        "//python:py_runtime_info_bzl",
        "@bazel_skylib//rules:common_settings",
    ],
)

bzl_library(
    name = "py_test_macro_bzl",
    srcs = ["py_test_macro.bzl"],
    deps = [
        ":common_bazel_bzl",
        ":py_test_rule_bzl",
    ],
)

bzl_library(
    name = "py_test_rule_bzl",
    srcs = ["py_test_rule.bzl"],
    deps = [
        ":attributes_bzl",
        ":common_bzl",
        ":py_executable_bazel_bzl",
        ":semantics_bzl",
        "@bazel_skylib//lib:dicts",
    ],
)

bzl_library(
    name = "py_toolchain_suite_bzl",
    srcs = ["py_toolchain_suite.bzl"],
    deps = [
        ":config_settings_bzl",
        ":text_util_bzl",
        ":toolchain_types_bzl",
        "@bazel_skylib//lib:selects",
    ],
)

bzl_library(
    name = "py_wheel_bzl",
    srcs = ["py_wheel.bzl"],
    visibility = ["//:__subpackages__"],
    deps = [
        ":py_package_bzl",
        ":stamp_bzl",
    ],
)

bzl_library(
    name = "reexports_bzl",
    srcs = ["reexports.bzl"],
    visibility = [
        "//:__subpackages__",
    ],
    deps = [
        ":bazel_tools_bzl",
        "@rules_python_internal//:rules_python_config_bzl",
    ],
)

bzl_library(
    name = "register_extension_info_bzl",
    srcs = ["register_extension_info.bzl"],
)

bzl_library(
    name = "repo_utils_bzl",
    srcs = ["repo_utils.bzl"],
)

bzl_library(
    name = "semver_bzl",
    srcs = ["semver.bzl"],
)

bzl_library(
    name = "sentinel_bzl",
    srcs = ["sentinel.bzl"],
)

bzl_library(
    name = "stamp_bzl",
    srcs = ["stamp.bzl"],
    visibility = ["//:__subpackages__"],
)

bzl_library(
    name = "text_util_bzl",
    srcs = ["text_util.bzl"],
)

bzl_library(
    name = "toolchains_repo_bzl",
    srcs = ["toolchains_repo.bzl"],
    deps = [
        ":repo_utils_bzl",
        ":text_util_bzl",
        "//python:versions_bzl",
    ],
)

bzl_library(
    name = "toolchain_types_bzl",
    srcs = ["toolchain_types.bzl"],
)

bzl_library(
    name = "util_bzl",
    srcs = ["util.bzl"],
    visibility = [
        "//:__subpackages__",
    ],
    deps = [
        "@bazel_skylib//lib:types",
        "@rules_python_internal//:rules_python_config_bzl",
    ],
)

bzl_library(
    name = "version_label_bzl",
    srcs = ["version_label.bzl"],
)

# @bazel_tools can't define bzl_library itself, so we just put a wrapper around it.
bzl_library(
    name = "bazel_tools_bzl",
    srcs = [
        # This set of sources is overly broad, but it's the only public
        # target available across Bazel versions that has all the necessary
        # sources.
        "@bazel_tools//tools:bzl_srcs",
    ],
)

# @rules_cc does not offer a bzl_library target for @rules_cc//cc:defs.bzl
bzl_library(
    name = "rules_cc_srcs_bzl",
    srcs = ["@rules_cc//cc:bzl_srcs"],
    deps = [":bazel_tools_bzl"],
)

bzl_library(
    name = "semantics_bzl",
    srcs = ["semantics.bzl"],
)

# Needed to define bzl_library targets for docgen. (We don't define the
# bzl_library target here because it'd give our users a transitive dependency
# on Skylib.)
exports_files(
    [
        "coverage.patch",
        "repack_whl.py",
        "py_package.bzl",
        "py_wheel.bzl",
        "py_wheel_normalize_pep440.bzl",
        "reexports.bzl",
        "stamp.bzl",
        "util.bzl",
    ],
    visibility = ["//:__subpackages__"],
)

exports_files(
    ["python_bootstrap_template.txt"],
    # Not actually public. Only public because it's an implicit dependency of
    # py_runtime.
    visibility = ["//visibility:public"],
)

filegroup(
    name = "stage1_bootstrap_template",
    srcs = ["stage1_bootstrap_template.sh"],
    # Not actually public. Only public because it's an implicit dependency of
    # py_runtime.
    visibility = ["//visibility:public"],
)

filegroup(
    name = "stage2_bootstrap_template",
    srcs = ["stage2_bootstrap_template.py"],
    # Not actually public. Only public because it's an implicit dependency of
    # py_runtime.
    visibility = ["//visibility:public"],
)

filegroup(
    name = "zip_main_template",
    srcs = ["zip_main_template.py"],
    # Not actually public. Only public because it's an implicit dependency of
    # py_runtime.
    visibility = ["//visibility:public"],
)

# NOTE: Windows builds don't use this bootstrap. Instead, a native Windows
# program locates some Python exe and runs `python.exe foo.zip` which
# runs the __main__.py in the zip file.
alias(
    name = "bootstrap_template",
    actual = select({
        ":is_script_bootstrap_enabled": "stage1_bootstrap_template.sh",
        "//conditions:default": "python_bootstrap_template.txt",
    }),
    # Not actually public. Only public because it's an implicit dependency of
    # py_runtime.
    visibility = ["//visibility:public"],
)

# Used to determine the use of `--stamp` in Starlark rules
stamp_build_setting(name = "stamp")

config_setting(
    name = "is_script_bootstrap_enabled",
    flag_values = {
        "//python/config_settings:bootstrap_impl": "script",
    },
)

# This should only be set by analysis tests to expose additional metadata to
# aid testing, so a setting instead of a flag.
bool_setting(
    name = "visible_for_testing",
    build_setting_default = False,
    # This is only because it is an implicit dependency by the toolchains.
    visibility = ["//visibility:public"],
)

print_toolchains_checksums(name = "print_toolchains_checksums")

# Used for py_console_script_gen rule
py_binary(
    name = "py_console_script_gen_py",
    srcs = ["py_console_script_gen.py"],
    main = "py_console_script_gen.py",
    visibility = [
        "//visibility:public",
    ],
)

py_binary(
    name = "py_wheel_dist",
    srcs = ["py_wheel_dist.py"],
    visibility = ["//visibility:public"],
)

py_library(
    name = "py_console_script_gen_lib",
    srcs = ["py_console_script_gen.py"],
    imports = ["../.."],
    visibility = [
        "//tests/entry_points:__pkg__",
    ],
)

# The current toolchain's interpreter as an excutable, usable with
# executable=True attributes.
current_interpreter_executable(
    name = "current_interpreter_executable",
    # Not actually public. Only public because it's an implicit dependency of
    # py_exec_tools_toolchain.
    visibility = ["//visibility:public"],
)

sentinel(
    name = "sentinel",
)
